// #include <iostream>
// #include <queue>
// #include <vector>
#include "KamaCoder.h"

int KamaCoder138::run() {
  // 输入
  int n, m;
  cin >> n >> m;
  vector<vector<int>> grid(m, vector<int>(n, 0));
  int startx, starty;
  cin >> startx >> starty;

  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      cin >> grid[i][j];
    }
  }
  // 定义一个time矩阵，用来记录每个格子到起点的最短时间
  vector<vector<int>> time(m, vector<int>(n, -1));
  time[startx][starty] = 0;
  // 定义一个队列，用来存储待处理的格子
  queue<pair<int, int>> q;
  q.push(make_pair(startx, starty));
  // 开始处理
  while (!q.empty()) {
    int x = q.front().first;
    int y = q.front().second;
    q.pop();
    // 当前信号塔发射时间
    int t = grid[x][y] == 1 ? 1 : 2;
    // 处理当前格子的四个方向
    for (int i = 0; i < 4; i++) {
      int nx = x + dir[i][0];
      int ny = y + dir[i][1];
      // 越界检查
      if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;  // 跳过越界格子
      if (grid[nx][ny] == 0) continue;  // 非信号塔不处理
      // 更新了信号塔抵达时间才进行处理
      if (time[nx][ny] == -1 || time[nx][ny] > time[x][y] + t) {
        time[nx][ny] = time[x][y] + t;
        // 加入队列
        q.push(make_pair(nx, ny));
      }
    }
  }

  // 输出
  int result = 0;
  bool unreach = false;

  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      //  非信号塔跳过
      if (grid[i][j] == 0) continue;
      // 若当前信号塔的时间为-1，则表示没有抵达
      if (time[i][j] == -1) {
        unreach = true;
        break;
      }
      // 若当前信号塔的时间不为-1，则记录最小值
      result = max(result, time[i][j]);
    }
    // 若有信号塔没有抵达，则退出遍历
    if (unreach) break;
  }

  if (unreach) {
    cout << -1 << endl;
  } else {
    cout << result << endl;
  }
  return 0;
}